'use strict';

const crypto = require('crypto');
const BASE_URL = 'http://ceshi.zgwlkj.cn:10010'
// const BASE_URL = 'http://192.168.2.43:8080'
const db = uniCloud.database();
const APPID = '9e4c7515-ead0-40de-afb6-59a29de937b6'
const DEFAUTL_TIMEOUT = 30000;
const DEFAUTL_RETRY_COUNT = 3;
const RETRY_TIMEOUT = 3000;

const ProviderType = {
	CSJ: "csj",
	GDT: "gdt",
	KS: "ks"
};

const collectionName = "opendb-uniad-callback-log";

class DB {

	static save(data) {
		return new DB().add(data);
	}

	add(data) {
		const collection = db.collection(collectionName);
		const data2 = Object.assign(data, {
			ad_type: 0,
			create_date: new Date()
		})
		return collection.add(data2);
	}
}

class UserServer {

	static send(url, data) {
		return new UserServer().sendHttpRequest(url, data);
	}

	async sendHttpRequest(url, data) {
		let needRetry = data.provider !== ProviderType.GDT;
		let retryCount = needRetry ? DEFAUTL_RETRY_COUNT : 1;
		let timeout = needRetry ? RETRY_TIMEOUT : DEFAUTL_TIMEOUT;
		let result = null;

		while (retryCount > 0) {
			console.log("sendHttpRequest::count::" + retryCount + "::", url, data);

			try {
				result = await uniCloud.httpclient.request(url+'?getTime='+data.open, {
					method: 'POST',
					data,
					headers: {
						Authorization: data.toKen,
						sign:data.signData,
						appid:APPID
					},
					dataType: 'json',
					contentType: 'json',
					timeout
				});

				if (result) {

					console.log("请求个人信息", result.data)
					break;
				}
			} catch (e) {
				console.log(e);
			}

			retryCount--;
		}

		return result;
	}
}

exports.main = async (event, context) => {
	//event为客户端上传的参数
	console.log('event : ', event);
	console.log('context来源:', context.SOURCE);
	const {
		path,
		queryStringParameters
	} = event;
	
	
	const data = {
		adpId: event.adpid||'',
		platform: event.platform,
		provider: event.provider,
		transId: event.transId,
		sign: event.sign,
		extra: event.extra,
	    toKen:event.toKen,
		open:event.open||event.time,
		imei:event.imei,
		signData:event.signData||''
	}
	
	// 注意::必须验签请求来源
	const secret = APPID;// uniad 后台开通激励视频回调后生成的 secret
	const transId = data.transId;
	const sign2 = crypto.createHmac('sha256',Buffer.from(`${secret}`, 'utf8')).update(Buffer.from(`${transId}`, 'utf8')).digest().toString('base64');
	console.log("transId",transId)
	if (event.sign !== sign2) {
	  return {
			"isValid": false,
			"message":"领取失败"
		  };
	}
	
	
	// 可选将回调记录保存到uniCloud，避免用户服务器没有响应时有日志可查，如果选择了保存记录需要做定时清理日志，避免日志过多影响性能
	// try {
	//   await DB.save(data);
	// } catch (e) {
	//   console.log(e);
	// }
	
	const url = BASE_URL+"/adcpd/saveAdcpa"; // 用户业务服务器地址，为了避免请求被伪造，必须使用签名的方式请求
	const {
		data: {
			code,
			message
		}
	} = await UserServer.send(url, data);
	return {
	  "isValid": code ==200?true:false,
		"message":message
	}
	// let parameter = JSON.parse(event.extra)
	// let time = new Date().getTime() + "";
	
	// const data = {
	// 	adpId: event.adpid,
	// 	platform: event.platform,
	// 	provider: event.provider,
	// 	transId: event.trans_id,
	// 	extra: parameter.extra,
	// 	toKen: parameter.toKen,
	// 	open: time,
	// 	imei: parameter.imei
	// }


	// const secret ="08487beae7ba27f721b62e1a4911e4d98327a1a873178f0ee8d562b1fd5d9fca"; // uniad 后台开通激励视频回调后生成的 secret
	// const trans_id = event.trans_id;
	// const sign2 = crypto.createHash('sha256').update(`${secret}:${trans_id}`).digest('hex');
	// console.log("transId", trans_id)
	// if (event.sign !== sign2) {
	// 	return null;
	// }


	// // 可选将回调记录保存到uniCloud，避免用户服务器没有响应时有日志可查，如果选择了保存记录需要做定时清理日志，避免日志过多影响性能
	// // try {
	// //   await DB.save(data);
	// // } catch (e) {
	// //   console.log(e);
	// // }

	// const url = BASE_URL + "/adcpd/saveAdcpa"; // 用户业务服务器地址，为了避免请求被伪造，必须使用签名的方式请求
	// console.log("打印参数",data)
	// const {
	// 	data: {
	// 		code,
	// 		message
	// 	}
	// } = await UserServer.send(url, data);
	// return {
	// 	"isValid": true
	// }
};
